Bevezets a Visual Basic-be (VB 3.0-ra alapozva)
================================================
Negyedik rsz


Ez a rsz arrl szl, hogy hogyan fejleszhetnk tbbablakos rendszereket. Kezdjk is.

Tbbablakos rendszerek
-=-=-=-=-=-=-=-=-=-=-=

Termszetesen nem lehet minden elemet egyetlen ablakra rpakolni, mert akkor tlthatalann vlna a program. Kt elfogadott mdszer van az elemek csoportostsra, az egyik a tbbablakos megolds, a msik a "TabStrip" nev elemek hasznlata (utbbi csak 4.0-tl felfel rhet el, de azrt lesz sz rla ebben a rszben is). A TabStrip azokat a bizonyos "fleket" jelenti, mint pl. a Win95-ben, ha a kperny tulajdonsgait kred: van ott "Httr", "Kpernykml", "Megjelens", stb.

Kezdjk is a TabStrip-pel. Ezt az elemet a Win95 hozta be, ezrt alapban nem tallhat meg a 16 VB-knl. Alapban... De ht erre j a Visual Basic zna. Letlthetsz egy olyan kiegsztt, amivel knnyedn hasznlhatsz TabStrip-eket 16 bites Windows-ok alatt is:

http://w3.swi.hu/vbzona/tab16.zip

Elszr ennek a hasznlatt fogom bemutatni, majd utna rtrek a szabvnyos TabStrip-re is. A 16 bites TabStrip-nek csak 16 bites VB alatt van rtelme, ha neked jabb van, hagyd ki a kvetkez rszt.

16 bites TabStrip
-=-=-=-=-=-=-=-=-

Tmrtsd ki, tedd egy tetszleges knyvtrba. Megnzheted az EXE fjlt, gy fog majd a mienk is kinzni... Utna indtsd el a VB-t, s kezdj egy j project-et.

Most egy j dologrl lesz sz. A VB fejlesztkrnyezetben lehetsg van elre elksztetett elemek, rutinok hozzadsra. Ezt 3.0 all gy teheted meg, hogy a File menbl kivlasztod az Add File pontot, s onnan pedig kivlasztod a TAB.BAS nevezet fjlt. Ha minden jl ment, akkor a Project window-ban megltod a nevt. 

Az egyszersg kedvrt most csak kt "flet" fogunk hasznlni. A Form_Load eljrshoz msold be a kvetkezket:

Sub Form_Load()
  Dim c As Integer
  ReDim TabItems(2)
  Me.AutoRedraw = True
  TabItems(1) = "Elso ful"
  TabItems(2) = "Masodik ful"
  TabDialog Me, TabItems(), 1, 0, 0
  For c = 0 To 1
    Frame1(c).Move 8, 24
  Next c
  Frame1(0).ZOrder 0
End Sub

A General-hoz ezt (a General rszt az Object pontnl tallod meg, legfell):

Option Explicit
Dim Shared TabItems() As String

A Form_MouseUp-hoz pedig a kvetkezket:

Sub Form_MouseUp (Button As Integer, Shift As Integer, X As Single, Y As Single)
  Dim ActiveTab As Integer
  TabDialog Me, TabItems(), ActiveTab, X, Y
  Select Case ActiveTab
    Case 0
    Case 1, 2
      Frame1(ActiveTab - 1).ZOrder 0
  End Select
End Sub

(Ezek elg bonyolult dolgok, mivel egy bonyolult BAS fjlt vesznek alapul, nem fontos megrteni ket.)

Most egy olyan dolog kvetkezik, amirl mg nem volt sz. Azaz csak rszben. Ugyanis mr beszltem valamikor a tmbkrl. Nos, nem csak vltozk alkothatnak tmbt, hanem elemek is. Command Button-ok, Text Box-ok, s Frame-k is.

"Tmbsteni" egy elemet nagyon egyszeren lehet: mindssze a nevknek kell azonosnak lennie. Prbald csak ki, tegyl le kt Command Button-t, mindkettt nevezd el "Gomb"-nak. Miutn a msodik nevt is tlltottad, a gp elkezd rdekldni, hogy tmbb szeretnd-e vltoztatni ket. Ha igen, akkor gy tudsz rjuk hivatkozni: Gomb(0) s Gomb(1) Az index property-vel tudod lltani azt, hogy hnyadik elem legyen.

Akkor most ksztsnk egy kt elembl ll tmbt, mindkt elem egy frame legyen! Nem kell semmit se vltoztatni rajta, s minden jl megy, akkor lesz kt frame-d: Frame1(0) s Frame1(1). Ezekre pakolj r nhny dolgot. Ezt vagy gy red el, hogy a frame-n rajzolod meg az elemet, vagy gy, hogy egy mr meglv elemet kivgsz (Edit men: Cut), egyszer kattintasz a frame-re (kijelld), s utna beilleszted (Edit men: Paste).

Most mretezd a kt frame-t, s az ablakot kb. ugyanakkorra, a BorderStyle tulajdonsgukat lltsd False-ra, ezutn indtsd el a programot! Itt vannak a szp TabStrip-ek, s csak egy sima BAS fjlt hasznltunk fel. (A klnbz fjlfajtkrl majd a vgn rok egy keveset).

Akkor most lerom, hogy miket kell megvltoztatni ahhoz, hogy tbb "flet" is tudj hasznlni:

Form_Load-nl:

ReDim TabItems(x) - ahol "x" a "flek" szma

TabItems(1) = "..." - ahol "..." a flek felirata

For c = 0 To fsz
  Frame1(c).Move 8, 24
Next c - ahol "fsz" a frame-k szma minusz egy

Form_MouseUp-nl:

Case 1,2 - ha kett frame van akkor 1,2 ,ha hrom akkor 1,2,3 ,ha ngy akkor 1,2,3,4 stb

De vglis ott a pldaprogram, onnan hmoztam ki n is a dolgokat...

32 bites TabStrip
-=-=-=-=-=-=-=-=-

Akkor most trjnk t a 32 bites TabStrip-re. Itt mr sokkal egyszerbb a helyzet. Alapban a TabStrip nincs a Tools Window-ban, hozz kell adnod (jobb gomb a Tools Window-ra, Add Components). Pipld ki a Common Controls-t, majd Ok. Ekkor tbb j elem is hozz fog addni a Tools ablakhoz, de egyrtelm, melyik a TabStrip, de ha nem, akkor nzd a TABSTRIP.BMP-t.

Rajzolj egy szp nagy TabStrip-et. Itt sokkal egyszerbb a belltsa: ha elhelyezted, jobb gombbal kattints r, s vlaszd a Properties-t az elbukkan menbl.

Az ablak, ami megjelenik, nagyon hasznos, ezzel knnyedn tudsz bonyolultabb tulajdonsgokat is vltoztatni. Egybknt itt is fleket tallsz, ha mg nem tudod milyen az a fl, akkor ennl az ablaknl megltod :-). Vlaszd a msodik flet ("Tabs"), s a Caption-hz rd be: Els fl. Ezutn nyomd meg fent-kzpen az "Insert Tab" gombot. Ekkor az Index kettesre vlt, teht most mr a msodik fl tulajdonsgait lltod, ezrt most ezt rd be a Caption-hz: Msodik fl. Vgeztnk is, Alkalmaz majd Ok.

A klnbz kpernyk megjelentshez itt is frame-ket kell hasznlnunk, tmbstve. Valsznleg nem olvastad el a 16 bites TabStrip-et, ezrt nem fog feltnni neked, hogy kimsolok belle egy jkora rszt :-)

Nem csak vltozk alkothatnak tmbt, hanem elemek is. Command Button-ok, Text Box-ok, s Frame-k is. "Tmbsteni" egy elemet nagyon egyszeren lehet: mindssze a nevknek kell azonosnak lennie. Prbald csak ki, tegyl le kt Command Button-t, mindkettt nevezd el "Gomb"-nak. Miutn a msodik nevt is tlltottad, a gp elkezd rdekldni, hogy tmbb szeretnd-e vltoztatni ket. Ha igen, akkor gy tudsz rjuk hivatkozni: Gomb(0) s Gomb(1) Az index property-vel tudod lltani azt, hogy hnyadik elem legyen.

Akkor most ksztsnk egy kt elembl ll tmbt, mindkt elem egy frame legyen! Nem kell semmit se vltoztatni rajta, s minden jl megy, akkor lesz kt frame-d: Frame1(0) s Frame1(1). Ezekre pakolj r nhny dolgot. Ezt vagy gy red el, hogy a frame-n rajzolod meg az elemet, vagy gy, hogy egy mr meglv elemet kivgsz (Edit men: Cut), egyszer kattintasz a frame-re (kijelld), s utna beilleszted (Edit men: Paste).

Miutn vgeztl a frame-kel, a Visible s BorderStyle tulajdonsgukat lltsd False-ra, mretezd ket akkorra, mint a TabStip-ed, majd "hzd r" az sszeset (teht mindkettt :-) ) a TabStrip-re.

Akkor most jhet a kd:

Const FulekSzama = 2

Private Sub Form_Load()
 Frame1(0).Visible = True
End Sub

Private Sub TabStrip1_Click()
 For X = 0 To FulekSzama - 1
   Frame1(X).Visible = False
 Next X
 Frame1(TabStrip1.SelectedItem.Index - 1).Visible = True
End Sub

Mi trtnik itt: ugye minden frame egy helyen van, s nem lthat (Visible=False). 

A 32 bites TabStrip megvalstsra is biztostottam pldaprogramot, ha valami nem vilgos. Taln pldval knnyebb is megrtened, mintha tvenszer vgigolvasnd a fenti "hasznlati utastst".

Tbb ablak hasznlata
-=-=-=-=-=-=-=-=-=-=-

Jl van, akkor ez volt az egyik md tbbablakos rendszerek ksztsre. Jjjn a msik, sokkal egyszerbb megolds!

Ez az egsz azon alapul, hogy egyszeren betltesz egy msik ablakot. Valjban ez az igazi tbbablakos mdszer, a TabStrip-et csak gy rdekessgkppen rtam, kicsit elhzdott. :-)

Eddig ugye mindig csak egyetlen ablakkal dolgoztunk. Msodik ablakot VB 3.0-bl gy lehet hozzadni, hogy megnyomod a Toolbar-on a bal oldali gombot (legszlst). Ekkor a Project Window-ban tapasztalhatod is a vltozst, mr FORM1.FRM s FORM2.FRM is szerepel benne. VB 5.0-tl gy lehet form-ot hozzadni, hogy a Project menbl kivlasztod a Form-ot (els menpont), s az jabb ablakban pedig a "New Form" pontot. Itt egybknt hozzaadhatsz mr ltez  form-ot is.

Teht akkor kszts kt form-ot, tegyl r valamit, ami meg fogja klnbztetni a kettt. Ja, s egy-egy gombot, amivel vltani fogunk, ht, az sem rtana...

A form1-en lv gomb kdja:

Load form2
form2.Show
Unload form1

A form2-n lv gomb kdja:

Load form1
form1.Show
Unload form2

Az els sorban azt mondjuk, hogy tltse be a form2 nev ablakot. A msodik sorban azt, hogy jelentse meg (ha elzleg nem tltttk be az se baj, megteszi magtl is). A harmadikban pedig kidobjuk az aktulis form-ot, jelen esetben a form1-et.

Ez a plda rosszra neveli az embereket, ugyanis nagyobb alkalmazsok fejlesztsnl lelasstja a programot, ha llandan betltgetjk/kidoblgatjuk a memriba/memribl az ablakokat. A legtisztbb megolds az, hogyha a program elejn betltnk mindent egyszerre, s az ablakvltsokat gy intzzk el:

FormMegjelenitendo.Show
FormEltuntetendo.Hide

Mondjuk az is igaz, hogyha az sszes ablakot a memriban troljuk, akkor az nagy pazarls... Ez van, meg kell tallni az arany kzputat. Szemlyes vlemnyem szerint nem rdemes egyszerre betlteni az ablakokat 5-6 ablak alatt illetve 20 ablak fltt.

A form-ok elre betltse mellett szl az is, hogy ha mr be van tltve az egyik ablak, akkor annak elemeit a msik ablakbl is tudod bntani. Pldul ha a msodik ablakon (aminek a neve Form2) van egy TextBox, aminek a neve Szoveg, akkor azt az els ablakbl gy tudod lltani:

Form2.Szoveg.Text = "Ezt az els ablakrl lltottam..."

(Plda a tobbform.mak fjlban, most vigyztam, nem binrisban mentettem el, meg tudod nzni akarmilyen VB alatt).


Vltozk rvnyessgi szablyai
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

Ez a cm taln nem hangzik olyan izgalmasnak, de szorosan sszefgg a tbbablakos rendszerekkel. Megnzzk minden esetben, hogy egy vltoz meddig l.

Taln kezdjk a legegyszerbb esettel: a vltozt egy sima eljrson bell deklarlunk, legyen ez pldul a Form_Load. Mindjrt egy pldt is rakok, br nem hiszem hogy itt most ezek segtennek:

Sub Form_Load()
  Dim R As Integer
  RandomIze
  R = Int(100*Rnd(1))
  MsgBox CStr(R)
End Sub

(Na, de azrt jl sszektm a dolgokat: gy lehet vletlen szmot ellltani. Bekapcsoljuk a vletlenszm genertort a RandomIze sorral, majd az R vltoznak egy 1 s 100 kztti rteket adunk. Azrt kell megszorozni szzzal, mert ugye az Rnd fggvny 0 s 1 kztt adja a szmokat, az Int pedig eltnteti a tizedesvesszt.)

Ez mg nem minden, mg lesz egy gombunk is:

Sub Command1_Click ()
  MsgBox CStr(R)
End Sub

Vajon mit fog kirni a program, ha megnyomjuk a gombot? Szerintem sejted, semmit. Egy res message box fog rvlkodni a kperny kzepn. Mirt van ez? Azrt, mert az R vltoz rvnyessgi kre csak a Form_Load. Nem szmt az, hogy az eljrs egyszer lefutott, a vltoz nyom nlkl eltnik, ha eljrson bell deklarlod.

Termszetesen van megolds arra, hogy egy ablakon bell mindenhol hasznlhass egy vltozt. Ekkor hozznylunk a (General) rszhez. Itt kell deklarlnunk a vltozkat (teht ebben az esetben Dim R As Integer). A (General) rszt VB 3.0 alatt gy red el, hogy dupln kattintasz akrmire (persze a formod-on bell), s az Object combobox-ban kivlasztod a legfels elemed. 5.0-nl gy is megoldhatod, hogy nyomod a Page Up-ot, amg elrsz a (General)-hoz. Itt ugyangy jrunk el. A pldt megtallhatod GENERAL.MAK nven.

Mi trtnik akkor, ha a (General)-nl deklarltl egy Szam vltozt, de egy eljrson bell is deklarlsz egy Szam vltozt? A plda (GENERAL.MAK) erre is vonatkozik, de azrt lerom:  az eljrson belli Szam vltoz bkn fogja hagyni a (General)-ban deklarlt Szam vltozt.

s mi trtnik akkor, ha egy olyan vltozt szeretnk deklarlni, amit minden ablakbl el tudunk rni? Akkor szksgnk van egy BAS fjlra is. Errl mg mindig nem beszltem tl sokat, de mindennek eljn az ideje...

Szval egyelre elgedj meg azzal, hogy egy res BAS fjlt kell a projectnkhz hozzadni. VB 3.0 alatt gy rheted el, hogy az eszkztron balrl a msodik gombot megnyomod, VB 5.0-tl pedig Projet men, Add Module, New Module.

Ennek a BAS fjlnak is lehetnek eljrsai, fggvnyei, s ennek is van egy (General) rsze. Ide rd be:

Global Valtozo As Integer

Ezek utn a Valtozo vltozt akrhol hasznlhatod a programban, nem veszik el az rtke az ablakok kztt sem.



Ezt azt iromnyt Kvi Blint ksztette. Fellem azt csinlsz vele, amit akarsz, trhatod, de azrt emlts meg engem is, j? Frisstseket, folytatsokat mindig tallhatsz a Visual Basic znban: http://vbzona.fw.hu/